home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 076-100 / 079 / monproc / monproc.doc < prev    next >
Text File  |  1995-03-13  |  9KB  |  185 lines

  1. OVERVIEW:
  2.  
  3. MONPROC is a utility that monitors the AmigaDOS message activity for any 
  4. process.  This is useful when debugging device handlers or other such
  5. processes, or just for seeing how AmigaDOS works.
  6.  
  7. MONPROC was originally written by Phillip Lindsay of Commodore-Amiga, Inc.
  8. using the Manx Aztec C compiler.  I have re-organized the routines, although
  9. the algorithms are basically the same, and have used the Lattice C compiler
  10. version 3.10.  I hope that it still works with Manx, but I do not own that
  11. compiler, so I can not test it.
  12.  
  13. I have retained Phillips original copywrite notice, and have added my own when
  14. appropriate.  I hope that this satisfies Phillip's request to use the code but
  15. keep the copywrite notice intact.  I have included his original mail message
  16. at the end of this document.
  17.  
  18.  
  19. HOW TO USE MONPROC:
  20.  
  21. To start MONPROC, type
  22.  
  23.     1> MONPROC
  24.  
  25. MONPROC will show you a list of the processes currently running, and request
  26. that you choose one from the list by typing its number.  Once you have
  27. selected a process to monitor, MONPROC inserts its own PacketWait() routine in
  28. the pr_PktWait field of the monitored process' Process structure.  Every time
  29. the monitored process calls the AmigaDOS taskwait() routine to wait for a
  30. message to be issued or returned, MONPROC prints the contents of the message,
  31. and then returns it to the monitored process for its own use.  (See the
  32. comments within the code for details of how this is done).
  33.  
  34. Usually, you get lots of packets when anything interesting happens.  For
  35. instance, if you monitor a CLI process, you'll see the command-line prompts,
  36. then the command that was typed, then file lookups as the CLI searches the
  37. current PATH for the command, then file opens and file reads as the scatter
  38. loader brings the command into memory, then a close file, and then file
  39. look ups as the re-direction files are openned, and finally the output 
  40. from the command.
  41.  
  42. In order to slow down the printed packets so that you can read them, just
  43. click in the CLI window where the monitor is running (and the messages are
  44. printing) and press the space-bar.  This will halt the output until you 
  45. press the back-space key.  Note that the monitored process will block until
  46. you press the back-space because it is waiting for the monitor process to
  47. return its AmigaDOS message to it.
  48.  
  49. When you are done monitoring the process, click in the window where the
  50. packets are being displayed and press CTRL-C.  You should receive a message
  51. stating that the monitor is waiting for one more packet or for a CTRL-E.
  52. Try to force some DOS activity to occur in the monitored process (i.e., if the
  53. monitored process is a CLI, give it a command; if it's a disk handler, read
  54. something from the disk, etc.).  MONPROC should end when the next packet
  55. arrives.
  56.  
  57. If, for some reason, you can not force an AmigaDOS message to the monitored
  58. process, you can type CTRL-E to stop MONPROC.  The next message that arrives
  59. for the monitored processd is likely to cause it to crash, however.
  60.  
  61. The reason for this is simple, when you press CTRL-C, MONPROC removes its
  62. PacketWait() routine from the pr_PktWait field of the monitored process, but
  63. the monitored process probably IS STILL USING THE PacketWait() ROUTINE, so we
  64. can't let the monitor die just yet. (If we did, it's code would be removed 
  65. from memory, and the monitored process would crash when it received the next 
  66. message and tried to run the rest of the PacketWait() routine).  To solve this,
  67. we simply wait for one more message to be signalled, and then die.  Since
  68. we've already removed our code from pr_PktWiat, we can be assured that after
  69. the monitored process finishes using our PacketWait() routine, it will go
  70. back to using the normal one, so we can delete our code from memory without 
  71. causing a crash.
  72.  
  73.  
  74. COMMAND OPTIONS:
  75.  
  76. MONPROC takes two optional arguments.  The first controls the way large data
  77. buffers are displayed, and the second controls how FileLocks are displayed.
  78.  
  79. Normally, MONPROC tries to display data buffers as character strings within
  80. quotes.  When the buffer is very long, however (e.g., when a disk handler is
  81. returning a request for 1728 characters from a file), MONPROC will print
  82. the data buffer as a HEX dump (HEX codes followed by ASCII representations of
  83. these codes).  Since these take up a lot of space, you might not want to see
  84. them.  To suppress HEX dumps, use the NODUMP option when calling MONPROC:
  85.  
  86.     1> MONPROC NODUMP
  87.  
  88. Any data buffer that is over 50 characters will not be printed when you use
  89. the NODUMP option.
  90.  
  91. The second command line option is NOLOCK.  Normally when an AmigaDOS packet
  92. includes a FileLock structure, MONPROC tries to look up the name of the file
  93. associated with the lock and prints that rather than the lock itself. 
  94. Usually, this gives the most information about the lock.  In order to look up
  95. the name, however, MONPROC calls AmigaDOS routines like DupLock(),
  96. ParentDir(), and Examine().  If you are monitoring a file system handler, it
  97. will not be able to respond to these calls, because it is waiting for the
  98. monitor process to return the packet containing the FileLock in question.
  99. If MONPROC waits for the handler to finish with ParentDir() or Examine()
  100. before returing the packet, we have a deadlock situation, and both processes
  101. freeze.
  102.  
  103. To avoid this problem, use the NOLOCK option whenever you monitor file system
  104. processes (like those associated with DF0:, DF1:, RAM:, and VD0:):
  105.  
  106.     1> MONPROC NOLOCK
  107.  
  108. When NOLOCK is used, MONPROC will not try to look up the names of the locks,
  109. but will print just the volume name for the given lock.  In addition, it will
  110. give the access type (shared or exclusive) for the lock.  This information
  111. normally is not shown, because MONPROC can not look up the name associated
  112. with an exclusive lock.
  113.  
  114. The NODUMP and NOLOCK options can be used together, and can be supplied in any
  115. order.  The defaults are to show Locks and perform HEX dumps when needed. 
  116. These defaults can be changed in the file PrintPkt.c
  117.  
  118.  
  119. COMPILING AND LINKING MONPROC:
  120.  
  121. For Lattice C, use the following commands to compile and link the files:
  122.  
  123.     1> LC -v -L MONPROC GETPROCS GETDIR PRINTPKT
  124.  
  125. The -v option is required; MONPROC will not work without it.   I do not have 
  126. the Manx copmiler, so I can't tell you how to compile MONPROC with it.  I
  127. suspect that if any changes are required to make it run with Manx, they are
  128. probably minor.  I have retained all of Phillip Lindsay's #ifdef MANX code, so
  129. the transition should be pretty easy.
  130.  
  131.  
  132. SOME INTERESTING USES FOR THIS PROGRAM:
  133.  
  134. I saw MONPROC basically as an interesting tool for learning about how AmigaDOS
  135. works.  For instance, you can use it to see how the scatter-loader actually
  136. loads your program.  I was shocked to see how many parts my programs
  137. contained.  You can see what effect the SMALLDATA and SMALLCODE options have
  138. on your executables.
  139.  
  140. A more interesting use is to see how some of the CLI commands work.  You can
  141. follow the ParentDir calls for the CD command, and can see how the CLI looks
  142. down the PATH directories for your commands.
  143.  
  144. You can use MONPROC to help you debug device handlers (for instance, I used it
  145. to help me understand Matt Dillon's PIPE device).
  146.  
  147. You can use it to help debug file actions from within your own programs (see
  148. when your program opens files, and whether they are for reading or writing;
  149. see the data as it is sent to the files; see where you end up after a Seek(),
  150. see when it closes the files; etc.).
  151.  
  152. Finally, you can use MONPROC to produce a hardcopy listing of the I/O activity
  153. to particular devices.  For instance, I used MONPROC as the basis for my own
  154. program called HARDCOPY, which produces a hardcopy transcript of any CLI 
  155. session (i.e., all the text that appears in the CLI window is sent to a file 
  156. as well as to the CLI window).
  157.  
  158. Davide P. Cervone
  159. University of Rochester Computing Center            DPVC@UORDBV.BITNET
  160. Taylor Hall                                         dpvc@tut.cc.rochester.EDU
  161. Rochester, New York  14627                          dpvc@ur-tut.UUCP
  162. (716) 275-2811
  163.  
  164.  
  165. PHILLIP LINDSAY'S ORIGINAL COMMENTS:
  166.  
  167.     In the process structure you will find a field labeled "pr_PktWait." This
  168. is a pointer for a alternate wait routine for AmigaDOS message handling.
  169. Everytime the AmigaDOS taskwait() routine is called a check is made to see
  170. if the process PktWait field is non-zero...if non-zero a subroutine call is
  171. made to that address. The requirement of the subroutine is to wait for a
  172. message to arrive at the process port (pr_MsgPort) and to return the address
  173. of the message (NOT PACKET!) in D0.
  174. Anyway, what follows is a simple program that will allow you to monitor any
  175. process for packet activity. A binary is available for the asking. (uuencoded)
  176.     BTW, When you call a AmigaDOS routine [like Read()] that talks to a
  177. AmigaDOS handler you can monitor a process receiving packets.
  178. -phil [ I promise this time no two signatures ]
  179. ==============================================================================
  180.   Phillip Lindsay - Commodore Business Machines - Amiga Technical Support
  181.   UUCP: {ihnp4|seismo|caip}!cbmvax!phillip      - Phone: (215) 431-9180
  182.   No warranty is implied or otherwise given in the form of suggestion or 
  183.   example. Any opinions found here are of my making.
  184.  
  185.